package com.jews.framework.json;

import com.jn.easyjson.core.JSON;
import com.jn.easyjson.core.JsonTreeNode;
import com.jn.langx.util.reflect.type.Types;

import java.io.Reader;
import java.lang.reflect.Type;
import java.util.List;

/**
 * 抽象的 Json 工具类
 *
 * @author Bran Wang
 */
public abstract class AbstractJsonUtils {

    public abstract JSON getJson();

    public String toJsonString(Object obj) {
        if (obj == null) {
            return "";
        }
        return getJson().toJson(obj);
    }

    public JsonTreeNode toJavaObject(String json) {
        if (json == null) {
            return null;
        }
        return getJson().fromJson(json);
    }

    public <T> T toJavaObject(String json, Type typeOfT) {
        if (json == null) {
            return null;
        }
        return getJson().fromJson(json, typeOfT);
    }

    public <T> T toJavaObject(String json, Class<T> classOfT) {
        if (json == null) {
            return null;
        }
        return getJson().fromJson(json, classOfT);
    }

    public <T> T toJavaObject(Reader reader, Class<T> classOfT) {
        if (reader == null) {
            return null;
        }
        return getJson().fromJson(reader, classOfT);
    }

    public <T> T toJavaObject(Object obj, Type typeOfT) {
        if (obj == null) {
            return null;
        }
        if (obj instanceof String) {
            return toJavaObject((String) obj, typeOfT);
        }
        return getJson().fromJson(toJsonString(obj), typeOfT);
    }

    public <T> List<T> toJavaList(String json, Class<T> classOfT) {
        if (json == null) {
            return null;
        }
        Type type = Types.getListParameterizedType(classOfT);
        return getJson().fromJson(json, type);
    }

    public <T> List<T> toJavaList(String json, Type typeOfT) {
        if (json == null) {
            return null;
        }
        Type type = Types.getListParameterizedType(typeOfT);
        return getJson().fromJson(json, type);
    }

    public <T> T toJavaCollection(String json, Type type) {
        if (json == null) {
            return null;
        }
        return getJson().fromJson(json, type);
    }
}
